/*
 * jqModal - Minimalist Modaling with jQuery
 *   (http://dev.iceburg.net/jquery/jqmodal/)
 *
 * Copyright (c) 2007,2008 Brice Burgess <bhb@iceburg.net>
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 * 
 * $Version: 07/06/2008 +r13
 */
/*jshint eqeqeq:false */
/*global jQuery, define */
(function (factory) {
    "use strict";
    if (typeof define === "function" && define.amd) {
        // AMD. Register as an anonymous module.
        define([
            "jquery"
        ], factory);
    } else {
        // Browser globals
        factory(jQuery);
    }
}(function ($) {
    "use strict";
//module begin
    $.fn.jqm = function (o) {
        var p = {
            overlay: 50,
            closeoverlay: true,
            overlayClass: 'jqmOverlay',
            closeClass: 'jqmClose',
            trigger: '.jqModal',
            ajax: F,
            ajaxText: '',
            target: F,
            modal: F,
            toTop: F,
            onShow: F,
            onHide: F,
            onLoad: F
        };
        return this.each(function () {
            if (this._jqm) {
                return H[this._jqm].c = $.extend({}, H[this._jqm].c, o);
            }
            s++;
            this._jqm = s;
            H[s] = {c: $.extend(p, $.jqm.params, o), a: F, w: $(this).addClass('jqmID' + s), s: s};
            if (p.trigger) {
                $(this).jqmAddTrigger(p.trigger);
            }
        });
    };

    $.fn.jqmAddClose = function (e) {
        return hs(this, e, 'jqmHide');
    };
    $.fn.jqmAddTrigger = function (e) {
        return hs(this, e, 'jqmShow');
    };
    $.fn.jqmShow = function (t) {
        return this.each(function () {
            $.jqm.open(this._jqm, t);
        });
    };
    $.fn.jqmHide = function (t) {
        return this.each(function () {
            $.jqm.close(this._jqm, t);
        });
    };

    $.jqm = {
        hash: {},
        open: function (s, t) {
            var h = H[s], c = h.c, cc = '.' + c.closeClass, z = (parseInt(h.w.css('z-index')));
            z = (z > 0) ? z : 3000;
            var o = $('<div></div>').css({
                height: '100%',
                width: '100%',
                position: 'fixed',
                left: 0,
                top: 0,
                'z-index': z - 1,
                opacity: c.overlay / 100
            });
            if (h.a) {
                return F;
            }
            h.t = t;
            h.a = true;
            h.w.css('z-index', z);
            if (c.modal) {
                if (!A[0]) {
                    setTimeout(function () {
                        new L('bind');
                    }, 1);
                }
                A.push(s);
            }
            else if (c.overlay > 0) {
                if (c.closeoverlay) {
                    h.w.jqmAddClose(o);
                }
            }
            else {
                o = F;
            }

            h.o = (o) ? o.addClass(c.overlayClass).prependTo('body') : F;

            if (c.ajax) {
                var r = c.target || h.w, u = c.ajax;
                r = (typeof r === 'string') ? $(r, h.w) : $(r);
                u = (u.substr(0, 1) === '@') ? $(t).attr(u.substring(1)) : u;
                r.html(c.ajaxText).load(u, function () {
                    if (c.onLoad) {
                        c.onLoad.call(this, h);
                    }
                    if (cc) {
                        h.w.jqmAddClose($(cc, h.w));
                    }
                    e(h);
                });
            }
            else if (cc) {
                h.w.jqmAddClose($(cc, h.w));
            }

            if (c.toTop && h.o) {
                h.w.before('<span id="jqmP' + h.w[0]._jqm + '"></span>').insertAfter(h.o);
            }
            (c.onShow) ? c.onShow(h) : h.w.show();
            e(h);
            return F;
        },
        close: function (s) {
            var h = H[s];
            if (!h.a) {
                return F;
            }
            h.a = F;
            if (A[0]) {
                A.pop();
                if (!A[0]) {
                    new L('unbind');
                }
            }
            if (h.c.toTop && h.o) {
                $('#jqmP' + h.w[0]._jqm).after(h.w).remove();
            }
            if (h.c.onHide) {
                h.c.onHide(h);
            } else {
                h.w.hide();
                if (h.o) {
                    h.o.remove();
                }
            }
            return F;
        },
        params: {}
    };
    var s = 0, H = $.jqm.hash, A = [], F = false,
        e = function (h) {
            if (h.c.focusField === undefined) {
                h.c.focusField = 0;
            }
            if (h.c.focusField >= 0) {
                f(h);
            }
        },
        f = function (h) {
            try {
                $(':input:visible', h.w)[parseInt(h.c.focusField, 10)].focus();
            } catch (_) {
            }
        },
        L = function (t) {
            $(document)[t]("keypress", m)[t]("keydown", m)[t]("mousedown", m);
        },
        m = function (e) {
            var h = H[A[A.length - 1]], r = (!$(e.target).parents('.jqmID' + h.s)[0]);
            if (r) {
                $('.jqmID' + h.s).each(function () {
                    var $self = $(this), offset = $self.offset();
                    if (offset.top <= e.pageY && e.pageY <= offset.top + $self.height() && offset.left <= e.pageX && e.pageX <= offset.left + $self.width()) {
                        r = false;
                        return false;
                    }
                });
                f(h);
            }
            return !r;
        },
        hs = function (w, t, c) {
            return w.each(function () {
                var s = this._jqm;
                $(t).each(function () {
                    if (!this[c]) {
                        this[c] = [];
                        $(this).click(function () {
                            for (var i in {jqmShow: 1, jqmHide: 1}) {
                                for (var s in this[i]) {
                                    if (H[this[i][s]]) {
                                        H[this[i][s]].w[i](this);
                                    }
                                }
                            }
                            return F;
                        });
                    }
                    this[c].push(s);
                });
            });
        };
//module end
}));